#include <iostream>
#include <string>
#include <vector>

#include <cstdlib>
#include <assert.h>
#include <pthread.h>
#include <unistd.h>

using namespace std;

const int NUM = 10;

// 当成结构体使用，需要向线程传值在这里添加即可
class ThreadData
{
public:
    pthread_t tid;
    char namebuffer[64];
};

// 新线程
// 在函数的内部定义的变量是局部变量，具有临时性
//  在多线程的情况下，也同样没问题 -> 也说明每一个线程具有独立的栈结构
void *start_routine(void *arg) // 这个函数被多个线程进入，是可重入函数
{
    sleep(1);
    ThreadData *td = static_cast<ThreadData *>(arg);
    int cnt = 10;
    while (cnt)
    {
        cout << "我是新线程我正在运行, 我的名字是" << td->namebuffer << " cnt: " << cnt-- << " cnt地址:" << &cnt << endl;
        sleep(1);
        if (cnt == 5)
            pthread_exit(nullptr);//线程退出
    }
    delete td;
    return nullptr; // 线程函数退出的时候，线程就终止了
}

int main()
{
    // 1.创建一批线程
    vector<ThreadData *> threads; // 用于线程保存线程的数据
    for (int i = 0; i < NUM; i++)
    {
        ThreadData *td = new ThreadData();
        snprintf(td->namebuffer, sizeof(td->namebuffer), "%s:%d", "thread", i + 1);
        pthread_create(&td->tid, NULL, start_routine, td);
        threads.push_back(td);

        // pthread_t tid;
        //  pthread_create(&tid, NULL, start_routine, (void *)namebuffer);
        //  sleep(1);
    }
    for (auto &thread : threads)
    {
        cout << "creat thread: " << thread->namebuffer << ":" << thread->tid << " success" << endl;
    }
    while (true)
    {
        cout << "我是主线程, 我正在运行!" << endl;
        sleep(1);
    }
    return 0;
}